/*
 * mcu_temper.c
 *
 *  Created on: Jun 4, 2024
 *      Author: wangb
 */

#include "mcu_temper.h"
#include "stm32h7xx_hal.h"

// 定义常量
#define TEMPSENSOR_TYP_AVGSLOPE 2000.0  // 典型斜率（单位：uV/摄氏度）
#define TS_CAL1_VOLTAGE 620             // TS_CAL1电压（单位：mV）
#define TS_CAL1_TEMP 30                 // 校准1温度（单位：摄氏度）
#define VREFANALOG_VOLTAGE 3300.0       // 模拟参考电压（单位：mV）

/*
 * @名字：float Read_Internal_Temperature(void)
 * @日期：2024-06-03
 * @功能：获取MCU内部温度,并且打印出来
 * @参数：None
 * @返回值：None
 */
float Read_Internal_Temperature(void)
{
    uint32_t raw_adc_value;
    float temperature;

    // 启动ADC并等待转换完成
    if (HAL_ADC_Start(&hadc3) != HAL_OK)
    {
       // printf("ADC 启动失败\r\n");
        return -1; // 返回一个错误值
    }

    if (HAL_ADC_PollForConversion(&hadc3, HAL_MAX_DELAY) != HAL_OK)
    {
        //printf("ADC 转换失败\r\n");
        return -1; // 返回一个错误值
    }

    raw_adc_value = HAL_ADC_GetValue(&hadc3);
    HAL_ADC_Stop(&hadc3);

    // 使用宏计算温度
    temperature = __HAL_ADC_CALC_TEMPERATURE_TYP_PARAMS(
        TEMPSENSOR_TYP_AVGSLOPE,         // Avg_Slope单位为uV/摄氏度
        TS_CAL1_VOLTAGE,                 // TS_CAL1电压（单位：mV）
        TS_CAL1_TEMP,                    // 校准1温度（单位：摄氏度）
        VREFANALOG_VOLTAGE,              // 模拟参考电压（单位：mV）
        raw_adc_value,                   // 温度传感器的ADC转换数据（单位：数字值）
        ADC_RESOLUTION_16B               // ADC分辨率（假设为16位）
    );

    return temperature;
}
